// ============================
// 20.3.1 提供多种特化 - 高级示例
// ============================
如何通过提供多个模板特化来实现函数的选择性启用
1.基本思想：为不同的类型条件提供不同的模板特化版本
2.实现方式：
// 主模板 - 用于不可复制的类型
template <typename T, typename = void>
class ElementHandler {
public:
    static void process(T&& element) {
        // 只能移动，不能复制的处理方式
        std::cout << "Moving non-copyable element" << std::endl;
        T movedElement = std::move(element);
        // 处理movedElement...
    }
};

// 可复制类型的特化
template <typename T>
class ElementHandler<T, std::enable_if_t<std::is_copy_constructible_v<std::remove_reference_t<T>>>> {
public:
    static void process(T&& element) {
        // 可以安全地复制
        std::cout << "Copying element of type: " 
                  << typeid(std::remove_reference_t<T>).name() << std::endl;
        auto copy = element;  // 创建副本
        // 处理copy...
    }
};

// 特殊类型的另一个特化
template <typename T>
class ElementHandler<T, std::enable_if_t<std::is_same_v<std::remove_cv_t<std::remove_reference_t<T>>, 
                                                       std::string>>> {
public:
    static void process(T&& element) {
        std::cout << "Special handling for string: " << element << std::endl;
        // 字符串特殊处理...
    }
};

